Ggplot2 I

Metodologia Quantitativa I (UPF)

Jordi Mas Elias

https://www.jordimas.cat/

Sumari

  • El sistema de capes
  • Estètics
  • Geometries

Warm up

R learning curve

Fet amb ggplot2

El sistema de capes

Capes bàsiques

Gairebé sempre, una gràfica creada amb ggplot2 consisteix en tres capes1:

    1. Marc de dades
    1. Estètics
    1. Geometria
df |> 
  ggplot(aes(estètics)) +
  geometria()

Capes opcionals

Opcionalment, afegim més capes com per exemple:

    1. Facet
    1. Coordenades
    1. Escales
    1. Tema
    1. Etc

Exemple amb capes

Una gràfica totalment equipada amb capes.

bins |> 
  ggplot(aes(x = pvote, y = n, fill = type)) +
  geom_bar(stat = "identity", show.legend = F) + 
  geom_hline(yintercept = 0, size = 0.3) +
  scale_fill_manual(values = c("grey65", "grey35")) +
  facet_share(~type, dir = "h", scales = "free", reverse_num = TRUE) +
  coord_flip() +
  labs(x = NULL, fill = NULL, y = "Vote") +
  theme(panel.background = element_blank(),
        strip.background = element_blank(),
        strip.text = element_text(size = 16),
        text = element_text(size = 15),
        axis.line.x = element_line(size = 0.3),
        axis.title.x = element_text(vjust=125, size = 14))

Estètics

Coordenades cartesianes

  • Partim de dues dimensions: x i y.

Estètics

A dins d’aes(), indica què representa cada variable:

rendacs |> 
  ggplot(aes(x = import_euros, y = index_gini, col = nom_districte)) +
  geom_point()

  • x: variable eix horitzontal.
  • y: variable eix vertical.
  • col: color de la geometria.

Estètics vs. atributs

Color com a estètic

rendacs |> 
  ggplot(aes(x = import_euros, 
             y = index_gini, 
             col = nom_districte)) +
  geom_point()

Color com a atribut

rendacs |> 
  ggplot(aes(x = import_euros, 
             y = index_gini)) +
  geom_point(col = "red")

Estètics vs. atributs

Estètics: Representen una variable. Sempre a dins de la funció aes(). E.g.:

  • x = gdp
  • col = continent

Atributs: Representen característiques de geometria. Es posen fora de aes(), normalment a la funció geom_xxx(). E.g.:

  • col = "red"
  • size = 2

Estètics vs. atributs

Tipus d’atributs:

  • size: mida de la geometria.
  • alpha: transparència.
  • text: noms.
  • labels: etiquetes.
  • fill: Per barres, polígons i coses que es pinten.
  • shape: Principalment per punts.
  • linetype / lty: Per línies.

Geometries

Geometries

  • geom_bar()
  • geom_col()
  • geom_point()
  • geom_boxplot()
  • geom_smooth()
  • … fins a 35 geometries!

Una variable categòrica

Diagrama de barres (I)

Counts, etc.: geom_bar()

Code
accidents |> 
  ggplot(aes(x = nom_districte)) +
  geom_bar()

Una variable numèrica

Histograma

Casos per interval de dades: geom_histogram()

Code
accidents |> 
  ggplot(aes(x = hora_dia)) +
  geom_histogram(bins = 24)

Diagrama de densitat

Quan tenim molta info numèrica: geom_density()

Code
accidents |> 
  ggplot(aes(x = hora_dia)) +
  geom_density()

Dot plot

Semi-contínua, pocs casos (~100): geom_dotplot()

Code
accidents |> 
  filter(nom_barri == "el Camp de l'Arpa del Clot") |> 
  ggplot(aes(x = hora_dia)) +
  geom_dotplot()

Dues variables categòriques

Diagrama de barres (II)

Les barres s’omplen (fill) amb una variable Cat: geom_bar()

Code
accidents |>
  ggplot(aes(x = nom_districte, fill = descripcio_torn)) +
  geom_bar(position = "fill")

Una categòrica, una numèrica

Diagrama de barres (III)

Variable num. a les y (no un count): geom_col()

Code
municipi |> 
  ggplot(aes(x = comarca, y = superficie_km2)) +
  geom_col()

Diagrama de caixes (I)

Mostra la mediana i l’IQR: geom_boxplot()

Code
accidents |> 
  ggplot(aes(y = edat)) +
  geom_boxplot()

Diagrama de caixes (II)

Code
elecc19 |>
  filter(nombre_de_comunidad == "Andalucía") |> 
  mutate(cs_per = cs / poblacion * 100) |> 
  ggplot(aes(x = nombre_de_provincia, y = cs_per)) +
  geom_boxplot()

Diagrama de violins (I)

Semblant a un diagrama de densitat: geom_violin()

Code
elecc19 |>
  filter(nombre_de_comunidad == "Andalucía") |> 
  mutate(cs_per = cs / poblacion * 100) |> 
  ggplot(aes(x = fct_reorder(nombre_de_provincia, cs_per), y = cs_per)) +
  geom_violin() +
  coord_flip()

Diagrama de violins (II)

Code
rendacs |> 
  ggplot(aes(x = fct_reorder(nom_districte, import_euros), y = import_euros)) +
  geom_violin() +
  coord_flip()

Punts i text

Per percentatges: geom_point() + geom_text()

Code
lloguer_any |> 
  group_by(nom_districte) |>
  summarize(preu_m2 = round(mean(preu_m2, na.rm = T), 1)) |> 
  ggplot(aes(x = fct_reorder(nom_districte, preu_m2), y = preu_m2)) +
  geom_point(size = 10, col = "darkblue") +
  geom_text(aes(label = preu_m2), col = "white") +
  coord_flip() +
  theme_minimal() +
  labs(x = NULL, y = NULL)

Variable numèrica i temps

Diagrama de línies (I)

Línia temporal: geom_line()

Code
lloguer_any |> 
  group_by(any) |> 
  summarize(preu = mean(preu, na.rm = T)) |> 
  ggplot(aes(x = any, y = preu)) +
  geom_line()

Diagrama de línies (II)

Code
lloguer_any |> 
  group_by(any, nom_districte) |> 
  summarize(preu = mean(preu, na.rm = T)) |> 
  ggplot(aes(x = any, y = preu, col = nom_districte)) +
  geom_line()

Diagrama de línies: Exemple 1

Tot el codi es pot trobar aquí.

Diagrama de línies: Exemple 1

Article here | Code here

Path (I)

Dues variables numèriques en el temps: geom_path()

Code
lloguer_any |> 
  group_by(any, nom_districte) |> 
  summarize(preu = mean(preu, na.rm = T),
            preu_m2 = mean(preu_m2, na.rm = T)) |> 
  ggplot(aes(x = preu_m2, y = preu, col = nom_districte,
             alpha = any)) +
  geom_path(size = 1.2)

Path. Exemple

El codi es pot trobar aquí.

Dues numèriques

Points (I)

Two numeric variables: geom_point()

Code
rendacs |>  
  ggplot(aes(x = import_euros, y = index_gini)) +
  geom_point(col = "darkgreen")

Points (II)

Code
accidents |> 
  filter(longitud > 0) |> 
  ggplot(aes(x = longitud, y = latitud)) +
  geom_point() 

Jitter

For discrete-numerics OR overplotting: geom_jitter()

Code
accidents |>
  filter(edat > 0.1) |> 
  ggplot(aes(x = edat, y = hora_dia)) +
  geom_point(position = position_jitter(width = 0.3),
             alpha = 0.3)

Text

Abbreviations: geom_text() or geom_label()

Code
festivals |> 
  group_by(ambit) |> 
  summarize(bcn = mean(assistents_a_barcelona, na.rm = T),
            fora = mean(assistents_fora_de_barcelona, na.rm = T)) |> 
  ggplot(aes(x = bcn, y = fora)) +
  geom_point() +
  geom_text(aes(label = ambit), position = position_nudge(x = 200,
                                                          y = 100)) +
  xlim(4000, 19000)

Three variables

Tile

Two categoric, one numeric: geom_tile()

Code
accidents |> 
  count(hora_dia, descripcio_dia_setmana) |> 
  ggplot(aes(x = hora_dia, y = descripcio_dia_setmana, fill = n)) +
  geom_tile()

Estadística descriptiva

Mitjana i mediana

Línies amb informació: geom_vline() o geom_hline()

Code
municipi |> 
  ggplot(aes(x = superficie_km2)) +
  geom_density() +
  geom_vline(xintercept = mean(municipi$superficie_km2, na.rm = T),
             col = "blue") +
    geom_vline(xintercept = median(municipi$superficie_km2, na.rm = T),
             col = "green")

Intervals de confiança

Amb stat_summary()

Code
festivals |> 
  ggplot(aes(x = ambit, y = assistents_a_barcelona)) +
  geom_point(position = position_jitter(width = 0.1, height = 0)) +
  stat_summary(geom = "pointrange", fun.data = mean_se, col= "red", size = 0.8,
               fun.args = list(mult = 1.96)) +
  coord_flip()